#ifndef GY_BASICSGRAPHICSOBJECT_H
#define GY_BASICSGRAPHICSOBJECT_H
#include "Graphics/GY_Object.h"
#include <QGradient>
#include <QGraphicsPathItem>
#include "GY_ControlLibrary_global.h"
#include "Graphics/ContainerGraphics/GY_ContainerTransform.h"
#include <QVector>
/**
 * @brief The GY_BasicsGraphicsObject class
 * 基础图形基类
 */
class GY_CONTROLLIBRARY_EXPORT GY_BasicsGraphicsObject : public GY_Object,public QGraphicsPathItem
{
    Q_OBJECT

signals:
    //!isOpen开口发出信号重绘
    void updateDrawSig();

public:
    /**
     * @brief GY_BasicsGraphicsObject 构造函数
     * @param guid  物体唯一编码
     * @param parent 父级
     */
    explicit GY_BasicsGraphicsObject(const QString &guid,QGraphicsItem *pItem,QGraphicsItem *pParentItem = nullptr);
    ~GY_BasicsGraphicsObject(){}
    //!继承基类重写
    GY_Object * copyItem(const QString &guid = QString()) override;
    /**
     * @brief updataPen 更新笔
     */
    virtual void updataPen();
    /**
     * @brief updataBrush 更新画刷
     */
    virtual void updataBrush();

protected:
    /**
     * @brief getLineStyle 获取线条样式
     * @param lineStyle 线条格式数字
     * @param vector 记录容器
     * @return 返回更新是否成功
     */
    bool getLineStyle(const QString& lineStyle, QVector<qreal>& vector);
    /**
     * @brief convertingBinary 进制转换
     * @param hex 十六进制
     * @param binary 二进制
     * @return 返回转换是否成功
     */
    bool convertingBinary(const QChar &hex, QString& binary);
    /**
     * @brief updatePenColor 更新线条颜色
     * @param name 属性名称
     * @param value 颜色
     * @return 返回更新是否成功
     */
    bool updatePenColor(const QString &name, const QVariant &value);
    /**
     * @brief updatePenOpacity 更新线条的透明度
     * @param name 属性名称
     * @param value 透明度qreal值
     * @return 返回更新是否成功
     */
    bool updatePenOpacity(const QString &name, const QVariant &value);
    /**
     * @brief updatePenOpacity 更新笔的属性
     * @param name 属性名称
     * @param value 属性bool值:true为"Inherit"，false为"Local"
     * @return 返回更新是否成功
     */
    bool updatePenAttributes(const QString &name, const QVariant &value);
    /**
     * @brief updatePenOpacity 更新线条样式
     * @param name 属性名称
     * @param value 样式值:
     * QVector<qreal>中index(0)是Qt::PenCapStyle、Qt::PenJoinStyle与Qt::PenStyle的组合（|运算）；
     * index(1)为线条粗细；
     * 之后是自定义钢笔样式的数据。
     * @return 返回更新是否成功
     */
    bool updateLineStyle(const QString &name, const QVariant &value);
    /**
     * @brief updateIsFilled 更新是否填充
     * @param name 属性名称
     * @param value 是否填充bool
     * @return 返回更新是否成功
     */
    bool updateIsFilled(const QString &name, const QVariant &value);
    /**
     * @brief updateFillColor 更新填充颜色
     * @param name 属性名称
     * @param value 颜色
     * @return 返回更新是否成功
     */
    bool updateFillColor(const QString &name, const QVariant &value);
    /**
     * @brief updateFillGradient 更新填充渐变色
     * @param name 属性名称
     * @param value 渐变参数
     * 列：
     *int gradientSpread = QGradient::PadSpread;//指定如何填充渐变之外的区域
        QColor colorStart = QColor(0,255,0);//开始颜色
        QColor colorStop = QColor(0,0,255);//结束颜色
        int gradientType = QGradient::LinearGradient;//指定渐变的类型
        QPointF pointFStart = QPointF(0,0);//开始的坐标或中心点坐标
        QPointF pointFStop = QPointF(1,1);//结束的坐标或径向梯度的焦点坐标
        qreal centerRadius = 100;//中心半径
        qreal focalRadius = 100;//径向梯度的焦点半径
        QVector<qreal> varGradientStyle;
        varGradientStyle<<gradientSpread<<colorStart.rgb()<<colorStop.rgb()<<gradientType<<pointFStart.x()
        <<pointFStart.y()<<pointFStop.x()<<pointFStop.y()<<centerRadius<<focalRadius;
     * @return 返回更新是否成功
     */
    bool updateFillGradient(const QString &name, const QVariant &value);
    /**
     * @brief updateFillStyle 更新填充样式
     * @param name 属性名称
     * @param value 选择填充样式值bool:true为纯色;false为渐变色
     * @return 返回更新是否成功
     */
    bool updateFillStyle(const QString &name, const QVariant &value);
    /**
     * @brief updatePattern 更新填充图案
     * @param name 属性名称
     * @param value 填充图案值
     * 列：
     * QVector<QPoint> points;
        points << QPoint(0,1)<< QPoint(2,1)<< QPoint(3,1) << QPoint(5,1)<< QPoint(5,15) << QPoint(14,8);
     * @return 返回更新是否成功
     */
    bool updatePattern(const QString &name, const QVariant &value);
    /**
     * @brief updateFillOpacity 更新填充透明度
     * @param name 属性名称
     * @param value 透明度qreal值
     * @return 返回更新是否成功
     */
    bool updateFillOpacity(const QString &name, const QVariant &value);
    /**
     * @brief updateFillAttributes 更新填充的属性
     * @param name 属性名称
     * @param value 属性bool值:true为"Inherit"，false为"Local"
     * @return 返回更新是否成功
     */
    bool updateFillAttributes(const QString &name, const QVariant &value);
    /**
     * @brief updateIsOpen  更新是否是开口图形
     * @param name 属性名称
     * @param value 是否是开口bool
     * @return 返回更新是否成功
     */
    bool updateIsOpen(const QString &name, const QVariant &value);
    /**
     * @brief updateIsVisible  更新是否显示
     * @param name 属性名称
     * @param value 是否显示
     * @return 返回更新是否成功
     */
    bool updateIsVisible(const QString &name, const QVariant &value);
    /**
     * @brief updateIsAntialiased  更新是否抗锯齿
     * @param name 属性名称
     * @param value 是否抗锯齿bool
     * @return 返回更新是否成功
     */
    bool updateIsAntialiased(const QString &name, const QVariant &value);
    /**
     * @brief updateIsOutLined  更新边框是否隐藏
     * @param name 属性名称
     * @param value 边框是否隐藏bool
     * @return 返回更新是否成功
     */
    bool updateIsOutLined(const QString &name, const QVariant &value);

    const QGradient costomGradient(const QVector<qreal> &value, const qreal& fillOpacity);
    QImage costomImage(const QVector<QPoint> &Transparencypoints, const QVector<QPoint> &points, const QColor value,const QImage &graImage, const QRgb graphicsViewFillColor =0xFF000000);

    // QGraphicsItem interface
protected:
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
    QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
    int m_index;

};

#endif // GY_BASICSGRAPHICSOBJECT_H
